home *** CD-ROM | disk | FTP | other *** search
Wrap
//Note to editor: NOT executed from XUL //Copyright 2009 Yongqian Li. (function() { //var $ = smarterwiki_$; //var $ = SW_$; var add_this_shortcut = window.add_this_shortcut || "add this shortcut"; var delete_this_shortcut = window.delete_this_shortcut || "delete this shortcut"; var press_space_to_search = window.press_space_to_search || "press space to search"; var confirm_bookmark_delete = window.confirm_bookmark_delete || "Are you sure you want to delete this bookmark?"; function qlauncher(doc)//, invoke_key) { var DOM_VK_CANCEL = 3; var DOM_VK_HELP = 6; var DOM_VK_BACK_SPACE = 8; var DOM_VK_TAB = 9; var DOM_VK_CLEAR = 12; var DOM_VK_RETURN = 13; var DOM_VK_ENTER = 14; var DOM_VK_SHIFT = 16; var DOM_VK_CONTROL = 17; var DOM_VK_ALT = 18; var DOM_VK_PAUSE = 19; var DOM_VK_CAPS_LOCK = 20; var DOM_VK_ESCAPE = 27; var DOM_VK_SPACE = 32; var DOM_VK_PAGE_UP = 33; var DOM_VK_PAGE_DOWN = 34; var DOM_VK_END = 35; var DOM_VK_HOME = 36; var DOM_VK_LEFT = 37; var DOM_VK_UP = 38; var DOM_VK_RIGHT = 39; var DOM_VK_DOWN = 40; var DOM_VK_PRINTSCREEN = 44; var DOM_VK_INSERT = 45; var DOM_VK_DELETE = 46; var DOM_VK_0 = 48; var DOM_VK_1 = 49; var DOM_VK_2 = 50; var DOM_VK_3 = 51; var DOM_VK_4 = 52; var DOM_VK_5 = 53; var DOM_VK_6 = 54; var DOM_VK_7 = 55; var DOM_VK_8 = 56; var DOM_VK_9 = 57; var DOM_VK_SEMICOLON = 59; var DOM_VK_EQUALS = 61; var DOM_VK_A = 65; var DOM_VK_B = 66; var DOM_VK_C = 67; var DOM_VK_D = 68; var DOM_VK_E = 69; var DOM_VK_F = 70; var DOM_VK_G = 71; var DOM_VK_H = 72; var DOM_VK_I = 73; var DOM_VK_J = 74; var DOM_VK_K = 75; var DOM_VK_L = 76; var DOM_VK_M = 77; var DOM_VK_N = 78; var DOM_VK_O = 79; var DOM_VK_P = 80; var DOM_VK_Q = 81; var DOM_VK_R = 82; var DOM_VK_S = 83; var DOM_VK_T = 84; var DOM_VK_U = 85; var DOM_VK_V = 86; var DOM_VK_W = 87; var DOM_VK_X = 88; var DOM_VK_Y = 89; var DOM_VK_Z = 90; var DOM_VK_CONTEXT_MENU = 93; var DOM_VK_NUMPAD0 = 96; var DOM_VK_NUMPAD1 = 97; var DOM_VK_NUMPAD2 = 98; var DOM_VK_NUMPAD3 = 99; var DOM_VK_NUMPAD4 = 100; var DOM_VK_NUMPAD5 = 101; var DOM_VK_NUMPAD6 = 102; var DOM_VK_NUMPAD7 = 103; var DOM_VK_NUMPAD8 = 104; var DOM_VK_NUMPAD9 = 105; var DOM_VK_MULTIPLY = 106; var DOM_VK_ADD = 107; var DOM_VK_SEPARATOR = 108; var DOM_VK_SUBTRACT = 109; var DOM_VK_DECIMAL = 110; var DOM_VK_DIVIDE = 111; var DOM_VK_F1 = 112; var DOM_VK_F2 = 113; var DOM_VK_F3 = 114; var DOM_VK_F4 = 115; var DOM_VK_F5 = 116; var DOM_VK_F6 = 117; var DOM_VK_F7 = 118; var DOM_VK_F8 = 119; var DOM_VK_F9 = 120; var DOM_VK_F10 = 121; var DOM_VK_F11 = 122; var DOM_VK_F12 = 123; var DOM_VK_F13 = 124; var DOM_VK_F14 = 125; var DOM_VK_F15 = 126; var DOM_VK_F16 = 127; var DOM_VK_F17 = 128; var DOM_VK_F18 = 129; var DOM_VK_F19 = 130; var DOM_VK_F20 = 131; var DOM_VK_F21 = 132; var DOM_VK_F22 = 133; var DOM_VK_F23 = 134; var DOM_VK_F24 = 135; var DOM_VK_NUM_LOCK = 144; var DOM_VK_SCROLL_LOCK = 145; var DOM_VK_COMMA = 188; var DOM_VK_PERIOD = 190; var DOM_VK_SLASH = 191; var DOM_VK_BACK_QUOTE = 192; var DOM_VK_OPEN_BRACKET = 219; var DOM_VK_BACK_SLASH = 220; var DOM_VK_CLOSE_BRACKET = 221; var DOM_VK_QUOTE = 222; var DOM_VK_META = 224; var keycodes = {}; keycodes[DOM_VK_SPACE] = ' '; keycodes[DOM_VK_A] = 'a'; keycodes[DOM_VK_B] = 'b'; keycodes[DOM_VK_C] = 'c'; keycodes[DOM_VK_D] = 'd'; keycodes[DOM_VK_E] = 'e'; keycodes[DOM_VK_F] = 'f'; keycodes[DOM_VK_G] = 'g'; keycodes[DOM_VK_H] = 'h'; keycodes[DOM_VK_I] = 'i'; keycodes[DOM_VK_J] = 'j'; keycodes[DOM_VK_K] = 'k'; keycodes[DOM_VK_L] = 'l'; keycodes[DOM_VK_M] = 'm'; keycodes[DOM_VK_N] = 'n'; keycodes[DOM_VK_O] = 'o'; keycodes[DOM_VK_P] = 'p'; keycodes[DOM_VK_Q] = 'q'; keycodes[DOM_VK_R] = 'r'; keycodes[DOM_VK_S] = 's'; keycodes[DOM_VK_T] = 't'; keycodes[DOM_VK_U] = 'u'; keycodes[DOM_VK_V] = 'v'; keycodes[DOM_VK_W] = 'w'; keycodes[DOM_VK_X] = 'x'; keycodes[DOM_VK_Y] = 'y'; keycodes[DOM_VK_Z] = 'z'; keycodes[DOM_VK_SUBTRACT] = '-'; keycodes[DOM_VK_F1] = "F1"; keycodes[DOM_VK_F2] = "F2"; keycodes[DOM_VK_F3] = "F3"; keycodes[DOM_VK_F4] = "F4"; keycodes[DOM_VK_F5] = "F5"; keycodes[DOM_VK_F6] = "F6"; keycodes[DOM_VK_F7] = "F7"; keycodes[DOM_VK_F8] = "F8"; keycodes[DOM_VK_F9] = "F9"; keycodes[DOM_VK_F10] = "F10"; keycodes[DOM_VK_ESCAPE] = "esc"; var USER_SEARCH_KEY_HINT = press_space_to_search; var qlauncher_xhtml = '' + '<div id="qlauncher">' + ' <div id="qlauncher-overlay" style="display: none !important;">' + ' <div id="qlauncher-floater">' + ' <div id="qlauncher-panel">' + ' <div id="qlauncher-search">' + ' <form id="qlauncher-search-form" action="#">' + ' <label for="qlauncher-search-input" class="qlauncher-shortcut-key">_: </label><div class="qlauncher-shortcut-favicon">' + ' <a id="qlauncher-search-on-goog-link" class="qlauncher-shortcut-link" title="search on Google" href="http://google.com">' + ' <img class="qlauncher-favicon" src="http://www.google.com/favicon.ico" alt=" " />' + ' </a>' + ' </div><input id="qlauncher-search-input" type="text" value="' + USER_SEARCH_KEY_HINT + '" spellcheck="true" />' + //' <!--' + //' NOTE: the reason that the above <>s are all scrunched up is that they' + //' NOTE: are inline-block elements. HTML treats the newlines and' + //' NOTE: spacing as spaces and allocates space for them, causing' + //' NOTE: an extra gap' + //' -->' + ' </form>' + ' </div>' + ' <div id="qlauncher-search-results">' + ' <ul id="qlauncher-search-result-list">' + ' <!--' + ' <li class="qlauncher-search-result">' + ' </li>' + ' -->' + ' </ul>' + ' </div>' + ' <div id="qlauncher-shortcuts">' + ' <ul id="qlauncher-shortcut-list" class="qlauncher-clearfix">' + ' <!--' + ' <li class="qlauncher-shortcut">' + ' </li>' + ' -->' + ' </ul>' + ' </div>' + ' </div>' + ' </div>' + ' </div>' + '</div>'; var searching = false; var injectQLauncher = function() { if($("#qlauncher", doc).size() == 0) { $(qlauncher_xhtml, doc).appendTo($("body", doc)); $("#qlauncher-overlay", doc).mousedown(function(event) { if(is_qlauncher_active()) { $("#qlauncher-overlay", doc).fadeOut("slow"); } }); $("#qlauncher-panel", doc).mousedown(function(event) { event.stopPropagation();//override above handler //don't cancel default or input would stop focusing. }); var currQuery = null; var searchTimer = null; var request = null; var onactiviateSearch = function() { if(!searching) { searching = true; $("#qlauncher-shortcut-list", doc).slideUp("fast", function() { $("#qlauncher-search-result-list").slideDown("fast"); //LOG("slid down: " + getComputedStyle(document.getElementById("qlauncher-search-result-list"), "").height); }); if($("#qlauncher-search-input", doc).attr("value") == USER_SEARCH_KEY_HINT) { $("#qlauncher-search-input", doc).attr("value", ""); } } }; var ondeactivateSearch = function() { if(searching) { searching = false; $("#qlauncher-search-result-list").slideUp("fast", function() { $("#qlauncher-shortcut-list", doc).slideDown("fast"); //LOG("slid up: " + getComputedStyle(document.getElementById("qlauncher-search-result-list"), "").height); }); /* */ } }; var resetSearchTimer = function() { window.clearTimeout(searchTimer); searchTimer = null; }; var startSearchTimer = function() { searchTimer = window.setTimeout(function() { runSearch($("#qlauncher-search-input", doc).attr("value")) }, 450); }; var addSearchResult = function(i, title, link_href, desc) { var shortcut_key = "F" + (i+1); var domain = new RegExp("http(?:s)?://([^/]*).*").exec(link_href)[1]; var favicon_src = "http://" + domain + "/favicon.ico"; var $a_title = $('<a class="qlauncher-search-result-title"></a>') .attr("href", link_href) .append(title) var $li = $('<li class="qlauncher-search-result-list-item"></li>').append( $('<div class="qlauncher-search-shortcut"></div>').append( '<div class="qlauncher-shortcut-key">' + ' <a class="qlauncher-shortcut-link" href="' + link_href + '">' + ' ' + shortcut_key + ': ' + ' </a>' + '</div>' + '<div class="qlauncher-shortcut-favicon">' + ' <a class="qlauncher-shortcut-link" href="' + link_href + '">' + ' <img class="qlauncher-favicon" src="' + favicon_src + '" alt=" " />' + ' </a>' + '</div>' ) ).append( $('<div class="qlauncher-search-result"></div>').append( $a_title ).append( $('<div class="qlauncher-search-result-desc"></div>') .append(desc) ) ); $("#qlauncher-search-result-list", doc).append( $li ); var command_handler = function() { $li .animate({opacity: "0"}, 200) .animate({opacity: "1"}, 200) .animate({opacity: "0"}, 200) .animate({opacity: "1"}, 200, "linear", function() { if(SW_getBoolPref("extensions.smarterwiki.qlauncher_open_new_tab")) { SW_openNewTab(link_href); } else { doc.defaultView.location.href = link_href; } //$("#qlauncher-overlay", doc).fadeOut("fast"); }); return false;//cancel default actions associated with the function keys }; shortcut_search_command_of[shortcut_key] = command_handler; $a_title.click(command_handler); $li.click(command_handler); }; var getGoogleSearchURL = function(query) { return "http://www.google.com/search?q=" + encodeURIComponent(query) } var runSearch = function(query) { if(query) { $("#qlauncher-search", doc).addClass("searching"); request = SW_$getJSON("http://ajax.googleapis.com/ajax/services/search/web",//safe because this code is sandboxed { "v": "1.0", "rsz": "small", "q": query, }, function(data) { $("#qlauncher-search", doc).removeClass("searching"); $("#qlauncher-search-result-list", doc).slideUp("fast", function() { $("#qlauncher-search-result-list", doc).empty().hide(); for(var i = 0; i < data["responseData"]["results"].length; i++) { addSearchResult(i, data["responseData"]["results"][i]["title"], data["responseData"]["results"][i]["unescapedUrl"], data["responseData"]["results"][i]["content"]); } addSearchResult(data["responseData"]["results"].length, "More results...", getGoogleSearchURL(query), ""); $("#qlauncher-search-result-list", doc).slideDown("fast"); }); } ); } }; $("form#qlauncher-search").submit(function(e) { e.preventDefault(); resetSearchTimer(); runSearch($("#qlauncher-search-input").attr("value")); }); var inputChanged = function() { if(this.value == currQuery) { return; } currQuery = this.value; $("#qlauncher-search-on-goog-link").attr("href", getGoogleSearchURL(this.value)); if(request) { SW_abortReq(request);//request.abort(); request = null; $("#qlauncher-search", doc).removeClass("searching"); } resetSearchTimer(); startSearchTimer(); }; $("#qlauncher-search-input", doc) .focus(inputChanged) .change(inputChanged) .keypress(inputChanged) .keydown(inputChanged) .keyup(inputChanged) //.mouseup(inputChanged) //.mousedown(inputChanged) //.mouseout(inputChanged) //.click(inputChanged) .blur(inputChanged); $("#qlauncher-search-input", doc).focus(function() { onactiviateSearch(); }); /* $("#qlauncher-search-input", doc).blur(function() { ondeactivateSearch(); }); */ $("#qlauncher-panel", doc).click(function() { ondeactivateSearch(); }); $("#qlauncher-search-input", doc) .click(function(event) { event.stopPropagation();//override above handler }); } //else ignore }; var is_qlauncher_active = function() { var d = $("#qlauncher-overlay", doc).css("display"); return d != "none" && d != null; } var is_qlauncher_enabled = function() { return SW_getBoolPref("extensions.smarterwiki.enable_qlauncher"); } var shortcut_command_of = {}; var shortcut_search_command_of = {}; var addShortcut = function(shortcut_key, favicon_src, label, link_href, itemId, phantom) { var colored_label = ""; var already_colored = false; for(var c = 0; c < label.length; c++) { if(label.charAt(c).toLowerCase() == shortcut_key && !already_colored) { colored_label += '<span class="qlauncher-key-char">'; colored_label += label.charAt(c); colored_label += '</span>'; already_colored = true; } else { colored_label += label.charAt(c); } } var $shortcut = $( '<div class="qlauncher-shortcut-key">' + ' <a class="qlauncher-shortcut-link" href="' + link_href + '">' + ' ' + shortcut_key + ': ' + ' </a>' + '</div>' + '<div class="qlauncher-shortcut-favicon">' + ' <a class="qlauncher-shortcut-link" href="' + link_href + '">' + ' <img class="qlauncher-favicon" src="' + favicon_src + '" alt=" " />' + ' </a>' + '</div>' + '<div class="qlauncher-shortcut-label">' + ' <a class="qlauncher-shortcut-link qlauncher-text" href="' + link_href + '">' + ' ' + colored_label + ' </a>' + '</div>' , doc); var $li = $('<li class="qlauncher-shortcut-list-item"></li>', doc); var $enclosing_div = $('<div class="qlauncher-shortcut"></div>', doc) .append($shortcut) .appendTo( $li.appendTo($("#qlauncher-shortcut-list", doc)) ); if(phantom) { $enclosing_div.addClass("phantom"); var $add_button = $('<a href="#" title="' + add_this_shortcut + '" class="qlauncher-add-shortcut-button"></a>') .click(function(event) { $enclosing_div .animate({opacity: "0"}, 200) .animate({opacity: "1"}, 200) .animate({opacity: "0"}, 200) .animate({opacity: "1"}, 200, "linear", function() { SW_addShortcut(label, link_href); setupShortcutList(); SW_showBookmarkCurrentPageEdit(); }); return false; }) .appendTo($enclosing_div); } else { var $delete_button = $('<a href="#" title="' + delete_this_shortcut + '" class="qlauncher-delete-shortcut-button"></a>') .click(function(event) { if(doc.defaultView.confirm(confirm_bookmark_delete)) { SW_removeBookmark(itemId); $li.fadeOut("fast", function() { $li.remove(); }); } return false; }) .appendTo($enclosing_div); } var command_handler = function() { $enclosing_div .animate({opacity: "0"}, 200) .animate({opacity: "1"}, 200) .animate({opacity: "0"}, 200) .animate({opacity: "1"}, 200, "linear", function() { if(SW_getBoolPref("extensions.smarterwiki.qlauncher_open_new_tab")) { SW_openNewTab(link_href); } else { doc.defaultView.location.href = link_href; } $("#qlauncher-overlay", doc).fadeOut("fast"); }); }; shortcut_command_of[shortcut_key] = command_handler; $enclosing_div.click(function() { command_handler(); return false; //cancel link action }); }; var cleanupShortcuts = function(shortcuts) { var used_keys = {}; for(var i = 0; i < shortcuts.length; i++) { if(shortcuts[i][0]) { used_keys[shortcuts[i][0]] = true; } } var letters = "abcdefghijklmnopqrstuvwxyz"; for(var i = 0; i < shortcuts.length; i++) { if(!shortcuts[i][0]) { var try_letters = shortcuts[i][2].toLowerCase() + letters; for(var b = 0; b < try_letters.length; b++) { var c = try_letters.charAt(b); if(c != " " && !used_keys[c]) { shortcuts[i][0] = c; used_keys[c] = true; break; } } } } }; var addShortcuts = function(shortcuts) { cleanupShortcuts(shortcuts); for(var i = 0; i < shortcuts.length; i++) //for each(var shortcut in shortcuts) //YUI chokes { var shortcut = shortcuts[i]; //addShortcut.apply(this, shortcut); addShortcut(shortcut[0], shortcut[1], shortcut[2], shortcut[3], shortcut[4], false); //(shortcut_key, favicon_src, label, link_href, itemId, phantom) } addShortcut("?", SW_getFaviconURL(document.URL), document.title, document.URL, -1, true); /* addShortcut("a", "http://amazon.com/favicon.ico", "Amazon", "http://amazon.com"); addShortcut("d", "http://digg.com/favicon.ico", "Digg", "http://digg.com"); addShortcut("f", "http://facebook.com/favicon.ico", "Facebook", "http://facebook.com"); addShortcut("g", "http://google.com/favicon.ico", "Google", "http://google.com"); addShortcut("l", "http://lifehacker.com/favicon.ico", "Lifehacker", "http://lifehacker.com"); addShortcut("m", "http://mashable.com/favicon.ico", "Mashable", "http://mashable.com"); addShortcut("n", "http://nytimes.com/favicon.ico", "NYTimes", "http://nytimes.com"); addShortcut("r", "http://www.google.com/reader/ui/favicon.ico", "Reader", "http://reader.google.com"); addShortcut("s", "http://myspace.com/favicon.ico", "MySpace", "http://myspace.com"); addShortcut("u", "http://youtube.com/favicon.ico", "YouTube", "http://youtube.com"); addShortcut("w", "http://en.wikipedia.org/favicon.ico", "Wikipedia", "http://en.wikipedia.org"); addShortcut("x", "http://readwriteweb.com/favicon.ico", "ReadWriteWeb", "http://readwrtieweb.com"); //addShortcut("y", "http://yahoo.com/favicon.ico", "Yahoo", "http://yahoo.com"); */ }; /* var deepArrayEquals = function(a1, a2) { if(a1 == null || a2 == null) { return a1 == a2; } if(a1.length == a2.length) { for(var i = 0; i < a1.length; i++) { if(a1[i] instanceof Array && a2[i] instanceof Array) { if(!deepArrayEquals(a1[i], a2[i])) { // alert("deep a1[i] != a2[i]" + a1[i] + " " + a2[i]); return false; } } else if(a1[i] != a2[i]) { // alert("" + (typeof a1[i]) + (a1[i] instanceof Array) + " " + (a2[i] instanceof Array) + " a1[i] != a2[i]" + a1[i] + " " + a2[i]); return false; } } return true; } return false; }; // alert(deepArrayEquals(null, null) && deepArrayEquals([1, 2, 3], [1, 2, 3]) && !deepArrayEquals([1, 2, 3], [1, 2, 4]) && deepArrayEquals([1, 2, "3"], [1, 2, "3"]) && deepArrayEquals([[1, 2], 2, ["3", 0]], [[1, 2], 2, ["3", 0]])); */ var current_shortcuts = null; var setupShortcutList = function() { if(doc.designMode == "off") { if($("#qlauncher", doc).size() == 0) { injectQLauncher(); } var user_shortcuts = SW_getShortcuts(); if(current_shortcuts == null || current_shortcuts.toString() != user_shortcuts.toString()) //toString() is a bit of a hack but those are not Arrays and thus deepArrayEquals doesn't work { //alert("emptying"); $("#qlauncher-shortcut-list", doc).empty(); addShortcuts(user_shortcuts); current_shortcuts = user_shortcuts; } return true; } else { return false; } }; //preload qLauncher for speed if(is_qlauncher_enabled()) { if(doc.location.href.indexOf("https://") != 0 && SW_hasShortcuts()) // prevent (or delay) "Connection Partially Encrypted" warnings and do not create qLauncher folder { setTimeout(function() { setupShortcutList(); }, 2000); //only preload after 2 secs } } /* //do not pre-load -- can cause problems with html and introduce too much load on servers */ var getInvokeKey = function() { var invoke_key = SW_getCharPref( "extensions.smarterwiki.qlauncher_invoke_key"); return invoke_key; }; var matchesInvokeKey = function(event) { var keys = getInvokeKey().match(/(META|CTRL|ALT|SHIFT|[^+]+)/g); var c = ""; if(event.keyCode != 0) { if(event.keyCode in keycodes) { c = keycodes[event.keyCode]; } } else { c = String.fromCharCode(event.charCode); } if(c == " ") { c = "SPACE"; } c = c.toUpperCase(); var expected_c = ""; for(var i = 0; i < keys.length; i++) { var key = keys[i]; if(!key.match(/(META|CTRL|ALT|SHIFT)/)) { expected_c = key; break; } } return (event.ctrlKey == (keys.indexOf("CTRL") != -1)) && (event.altKey == (keys.indexOf("ALT") != -1)) && (event.shiftKey == (keys.indexOf("SHIFT") != -1)) && (keys.indexOf("META") == -1 || event.metaKey) && //if meta key is specified and there is no meta key -> bad, else OK. This is because ctrl also counts as meta (c == expected_c); }; //doc.getElementsByTagName("body")[0].addEventListener("keydown", function(event) //doc.wrappedJSObject.defaultView.addEventListener("keydown", function(event) //window.addEventListener("keydown", function(event) $(doc.defaultView).keydown(function(event) { if(matchesInvokeKey(event)) { if(is_qlauncher_active()) { $("#qlauncher-overlay", doc).fadeOut("slow"); //event.stopPropagation(); //event.preventDefault(); return false; //IMPORTANT: cancel it so that Firebug does not steal focus } else if(is_qlauncher_enabled()) { if(setupShortcutList()) // a bit slower to setup on the fly but more flexible { $("#qlauncher-overlay", doc).fadeIn("fast"); $("#qlauncher-panel", doc)[0].focus(); //event.stopPropagation(); //event.preventDefault(); return false; //IMPORTANT: cancel it so that Firebug does not steal focus } else { //we didn't handle the even cuz of problem setting up, do *not* cancel event } } //not active and not enabled? do not eat event then } else { if(is_qlauncher_active()) { if(event.keyCode in keycodes) { if(!searching && (keycodes[event.keyCode] == " " || keycodes[event.keyCode] == "-")) { setTimeout(function() { $("#qlauncher-search-input", doc).focus(); }, 50);//to prevent space from being typed into input return false; //to prevent page from moving down } if(keycodes[event.keyCode] == "esc") { $("#qlauncher-overlay", doc).fadeOut("slow"); } if(!searching && keycodes[event.keyCode] in shortcut_command_of) { return shortcut_command_of[keycodes[event.keyCode]](); } if(searching && keycodes[event.keyCode] in shortcut_search_command_of) { return shortcut_search_command_of[keycodes[event.keyCode]](); } } } } }); //}, false); $(doc.defaultView).keyup(function(event) { if(is_qlauncher_active() && !searching) { /* var c = String.fromCharCode(event.which); if(c == "-" || c == "_" || c == " ") { */ } }); }; $(document).ready(function() { if(document.designMode == "off") { if(self === top) //do not execute in iframe { qlauncher(document);//, "CTRL+SPACE"; } else { // alert("in an iframe"); } } else { //alert("in rich editor"); } }); }());